package com.smart4j.chapter.modules.web;

import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;

import com.google.gson.Gson;
/**
 * 文件上传servlet 
 */
@WebServlet("/fileInputUploadServlet")
// 该注解 将该Servlet 标记为一个文件上传的 servlet 
@MultipartConfig 
public class FileInputUploadServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// 1、 获取文件的存储路径
		String basePath = request.getServletContext().getRealPath(File.separator);
		String relativePath = "/userfiles";
		File file = new File(basePath + relativePath);
		if(!file.exists()){
			file.mkdirs();
			System.out.println("路径： "+basePath +" 创建成功!");
		}
		
		// 2、获取上传文件对象的集合
		Collection<Part> partList = request.getParts();
			// 记录上传文件路径，返回给前台
		List<String> pathList = new ArrayList<>();
		String destPath ;
		if(partList.size() == 1){
			// 单个文件上传
			Part part = request.getPart("uploadFile");
			// 获取header 如： form-data; name="uploadfile"; filename="2018-08-11 开【华夏视讯网首发hxsxw.com】.mkv"
			String header = part.getHeader("content-disposition");
			// 获取文件名
			String fileName = header.split(";")[2].split("=")[1].replaceAll("\"", "");
			// 执行写入操作 --- 上传到指定的目录
			destPath = basePath+ relativePath +File.separator+fileName;
			part.write(destPath);
			pathList.add(relativePath +File.separator+fileName);
		}else{
			for (Part part : partList) {
				// 多个文件上传
				String header = part.getHeader("content-disposition");
				/**
				 * bug: 上传一个文件，fileinput 组件会提交3个表单上来，这个问题暂未确定
				 */
				if(header != null && header.split(";").length == 3) {
					String fileName = getFileName(header);
					destPath = basePath+relativePath+File.separator+fileName;
					part.write(destPath);
					pathList.add(relativePath +File.separator+fileName);
				}
			}
		}
		/*
		 * BootStrap FileInput 插件需要返回Json数据 
		 */
		response.setContentType("text/json;charset=UTF-8");
		PrintWriter writer = response.getWriter();
		Gson gson = new Gson();
		String message = "{\"result\":"+gson.toJson(pathList)+"}";
		writer.write(message);
		writer.flush();
		writer.close();
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}
	
	 /**
      * 根据请求头解析出文件名
      * 请求头的格式：火狐和google浏览器下：form-data; name="file"; filename="snmp4j--api.zip"
      *                 IE浏览器下：form-data; name="file"; filename="E:\snmp4j--api.zip"
      * @param header 请求头
      * @return 文件名
      * @see https://www.cnblogs.com/xdp-gacl/p/4224960.html 
      * @date 2018年8月12日 22:57:27
      */
     public String getFileName(String header) {
         /**
          * String[] tempArr1 = header.split(";");代码执行完之后，在不同的浏览器下，tempArr1数组里面的内容稍有区别
          * 火狐或者google浏览器下：tempArr1={form-data,name="file",filename="snmp4j--api.zip"}
          * IE浏览器下：tempArr1={form-data,name="file",filename="E:\snmp4j--api.zip"}
          */
         String[] tempArr1 = header.split(";");
         /**
          *火狐或者google浏览器下：tempArr2={filename,"snmp4j--api.zip"}
          *IE浏览器下：tempArr2={filename,"E:\snmp4j--api.zip"}
          */
         String[] tempArr2 = tempArr1[2].split("=");
         //获取文件名，兼容各种浏览器的写法
         String fileName = tempArr2[1].substring(tempArr2[1].lastIndexOf("\\")+1).replaceAll("\"", "");
         return fileName;
     }
}
